package cn.mrcode.fd.utils;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author : zhuqiang
 * @version : V1.0
 * @date : 2016/1/18 22:08
 */
public class MyBeanUtils {
    // @formatter:off
	/****************************************************************************
	 * 					org.apache.commons.beanutils.BeanUtils  工具区
	 * @Description: TODO BeanUtils  工具区
	 * **************************************************************************/

	/**
	 * @Title: toBean
	 * @Description: 把单个的map转换成指定的po对象
	 * @param map
	 * @param clazz
	 * @return T
	 */
	@SuppressWarnings("rawtypes")
	public static <T> T toBean(Map map, Class<T> clazz) {
		try {
			T bean = clazz.newInstance();// 创建实例
			BeanComverutilsRegister(); //注册自定义转换
			BeanUtils.populate(bean, map);
			return bean;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	/**
	 *
	 * @Title: toBean
	 * @Description: 把单个的obj（这个obj对象是sql查询出来的，但是里面是一个map） 转换成po对象
	 * @param obj
	 * @param clazz
	 * @return T
	 * @date 2014年10月29日 下午2:46:11
	 */
	public static <T> T toBean(Object obj, Class<T> clazz) {
		try {
			T bean = clazz.newInstance();// 创建实例
			BeanComverutilsRegister();
			BeanUtils.copyProperties(bean, obj);
			//PropertyUtils.copyProperties(bean, obj); //不转换类型，对于包装基础类型来说
			return bean;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	/**
	 *
	 * @Title: BeanComverutilsRegister
	 * @Description: 注册转换器，解决某些属性为null 抛出的异常
	 * @return void
	 * @date 2014年10月29日 下午2:45:20
	 */
	private static void BeanComverutilsRegister() {
		ConvertUtils.register(
				new org.apache.commons.beanutils.converters.SqlDateConverter(null),
				java.sql.Date.class);
		ConvertUtils.register(
				new org.apache.commons.beanutils.converters.SqlDateConverter(null),
				java.util.Date.class);
		ConvertUtils.register(
				new org.apache.commons.beanutils.converters.SqlTimestampConverter(null),
				java.sql.Timestamp.class);
		ConvertUtils.register(  //解决转为金钱不能为空
				new org.apache.commons.beanutils.converters.BigDecimalConverter(null),
				java.math.BigDecimal.class);
		ConvertUtils.register(
				new org.apache.commons.beanutils.converters.IntegerConverter(null),
				java.lang.Integer.class);
		ConvertUtils.register(
				new org.apache.commons.beanutils.converters.DoubleConverter(null),
				java.lang.Double.class);
	}

	/**
	 * @Title: toListBean
	 * @Description: 将list中的map转换成po对象, list<map> to list<po>
	 * @param list
	 * @param clazz
	 * @return List<T>
	 */
	@SuppressWarnings("rawtypes")
	public static <T> List<T> toListBean(List<Map> list, Class<T> clazz) {
		List<T> resultList = new ArrayList<>();
		for (Map map : list) {
			T bean = MyBeanUtils.toBean(map, clazz);
			resultList.add(bean);
		}
		return resultList;
	}

	public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException {
        BeanComverutilsRegister();
		BeanUtils.copyProperties(dest,orig);
    }
}
